package com.airbnb.lottie.parser;

import com.airbnb.lottie.parser.moshi.JsonReader;
import com.airbnb.lottie.LottieComposition;
import com.airbnb.lottie.model.animatable.AnimatableFloatValue;
import com.airbnb.lottie.model.animatable.AnimatablePathValue;
import com.airbnb.lottie.model.animatable.AnimatableSplitDimensionPathValue;
import com.airbnb.lottie.model.animatable.AnimatableValue;
import com.airbnb.lottie.utils.Utils;
import com.airbnb.lottie.value.Keyframe;
import ohos.agp.utils.Point;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class AnimatablePathValueParser {

    private static final JsonReader.Options NAMES = JsonReader.Options.of("k", "x", "y");

    private AnimatablePathValueParser() {
    }

    public static AnimatablePathValue parse(JsonReader reader, LottieComposition composition) throws IOException {
        List<Keyframe<Point>> keyframes = new ArrayList<>();
        if (reader.peek() == JsonReader.Token.BEGIN_ARRAY) {
            reader.beginArray();
            while (reader.hasNext()) {
                keyframes.add(PathKeyframeParser.parse(reader, composition));
            }
            reader.endArray();
            KeyframesParser.setEndFrames(keyframes);
        } else {
            keyframes.add(new Keyframe<>(JsonUtils.jsonToPoint(reader, Utils.dpScale())));
        }
        return new AnimatablePathValue(keyframes);
    }

    /**
     * Returns either an {@link AnimatablePathValue} or an {@link AnimatableSplitDimensionPathValue}.
     * @param composition LottieComposition
     * @param reader JsonReader
     * @throws IOException
     * @return either an {@link AnimatablePathValue} or an {@link AnimatableSplitDimensionPathValue}
     */
    static AnimatableValue<Point, Point> parseSplitPath(JsonReader reader,
                                                        LottieComposition composition) throws IOException {

        AnimatablePathValue pathAnimation = null;
        AnimatableFloatValue xAnimation = null;
        AnimatableFloatValue yAnimation = null;

        boolean hasExpressions = false;

        reader.beginObject();
        while (reader.peek() != JsonReader.Token.END_OBJECT) {
            switch (reader.selectName(NAMES)) {
                case 0:
                    pathAnimation = AnimatablePathValueParser.parse(reader, composition);
                    break;
                case 1:
                    if (reader.peek() == JsonReader.Token.STRING) {
                        hasExpressions = true;
                        reader.skipValue();
                    } else {
                        xAnimation = AnimatableValueParser.parseFloat(reader, composition);
                    }
                    break;
                case 2:
                    if (reader.peek() == JsonReader.Token.STRING) {
                        hasExpressions = true;
                        reader.skipValue();
                    } else {
                        yAnimation = AnimatableValueParser.parseFloat(reader, composition);
                    }
                    break;
                default:
                    reader.skipName();
                    reader.skipValue();
            }
        }
        reader.endObject();

        if (hasExpressions) {
            composition.addWarning("Lottie doesn't support expressions.");
        }

        if (pathAnimation != null) {
            return pathAnimation;
        }
        return new AnimatableSplitDimensionPathValue(xAnimation, yAnimation);
    }

}
